FFMPEG对于rtp的推流以及VLC验证

您所在的位置:网站首页 ffmpeg 发送ice报文 FFMPEG对于rtp的推流以及VLC验证

FFMPEG对于rtp的推流以及VLC验证

2023-09-18 07:45| 来源: 网络整理| 查看: 265

前言

参考资料:

https://blog.csdn.net/zhoubotong2012/article/details/86711097

 

https://blog.csdn.net/zhoubotong2012/article/details/86711097

 

 

 

正文

首先, rtp每次推送只能推一路流, 如果用ffmpeg推送普通的影片,比如, mp4, 起码有视频流以及音频流,请在ffmpeg命令里面指定要推送的是视频还是音频, 否则会出现以下错误:

 

 

 

推送命令:

##推送视频流: ffmpeg -re -i magic-01.mp4 -vcodec  libx264 -an -f rtp rtp://192.168.0.101:11112>test_magic_01_video.sdp ##推送音频流 ffmpeg -re -i magic-01.mp4  -vn -acodec copy -f rtp rtp://127.0.0.1:11112>test_magic_01_audio.sdp 解释: -re 表示实时推送, 不加的话就是按照最大速度推送. -an 表示, 不要推audio 音频 -vn 表示 不要推 video 视频 后面的sdp表示顺便保存到sdp文件里面去.

 

注意!!!!

标准协议里面规定,rtp的端口要用偶数端口, rtcp的端口要用奇数端口, 在一些开源项目以及软件里面都遵守这个规则, 譬如:jrtplib,live555等, 如果你随便推送到奇数端口那么vlc是会报错的,就是10s内没有接收到数据.

 

执行推送命令以后ffmpeg出现:

2020-07-10_13-11.png

然后你可以看到当前目录下面有一份文件:

2020-07-10_13-11_1.png

 

内容为:

 

 

2020-07-10_13-12.png

 

注意到 文件前面的 [SDP]字样没有? 这个是不标准的, 用vlc打开是没有任何反应的, 根据描述:

 

2020-07-09_20-20.png

需要删除第一行的SDP字样,如下:

v=0 o=- 0 0 IN IP4 127.0.0.1 s=No Name c=IN IP4 192.168.0.101 t=0 0 a=tool:libavformat 58.29.100 m=video 11112 RTP/AVP 96 a=rtpmap:96 H264/90000 a=fmtp:96 packetization-mode=1

 

然后, 使用 vlc打开可以看到:

 

 

 

总结

就一个简单的ffmpeg推送rtp流, vlc接收并且播放都有几个坑点...

真不知道以后要弄 rtp接收合并为rtmp的时候会怎么样...

 

 

 

草稿[试错]

尝试推送普通mp4影片:

ffmpeg -re -i magic-01.mp4 -vcodec copy -f rtp rtp://127.0.0.1:1234>test_rtp_h264.sdp

出错:

 

其他人的解释:

2020-07-09_18-46.png

rtp自身限制每次只能一个媒体流, 修正如下:

##分别推送 视频以及音频到不同的端口. ffmpeg -re -i magic-01.mp4 -vcodec copy -an -f rtp rtp://127.0.0.1:11111>test_magic_01_video.sdp -vn -acodec copy -f rtp rtp://127.0.0.1:11112>test_magic_01_audio.sdp

成功:

2020-07-09_18-50.png本机

 

2020-07-09_18-50_1.png

美中不足的是,这个命令似乎先推audio,再推video,vidoe的sdp一直为0字节.

 

去掉audio的推送以后就能够直接看到video sdp有内容了,

然后, 查看本机端口,11111的使用情况:

2020-07-09_19-37.png

.....没有任何程序占用它们....

也就是说, 上面的文章都漏了一个东西, ffmpeg是推送端, 那么接收端在哪里? 哪个程序在监听11111这个端口?

 

 

尝试一

又查了一些资料, 我终于明白了:

 

 

https://www.cnblogs.com/vitoboy/p/8393205.html

 

首先, 使用ffmpeg推rtp的时候需要有一个接收端, vlc可以先作为接收端, 首先在vlc上面

"媒体"> "打开网络窜流"

2020-07-09_19-49.png

点击播放, 可以看到

 

vlc已经在准备中了, 然后 查询一下 端口11111的占用情况:

2020-07-09_19-51.png

vlc已经在监听端口了, 好了, 接下来就用ffmpeg推rtp流了:

ffmpeg -re -i magic-01.mp4 -vcodec copy -an -f rtp rtp://127.0.0.1:11111>test_magic_01_video.sdp

 

ffmpeg工作正常:

 

 

而这时候你会看到vlc提醒:

2020-07-09_19-52_1.png

https://www.techwalla.com/articles/how-to-play-an-sdp-stream-on-vlc

 

 

尝试二

 

[尝试一]不成功, 又找了些资料:

https://stackoverflow.com/questions/61687212/ffmpeg-vlc-won-t-open-sdp-files-generated-by-ffmpeg

里面提到:

2020-07-09_20-20.png

我查了一下ffmpeg生成的sdp格式, 确实有:

2020-07-09_20-19.png

SDP: 在第一行这种问题

 

删除掉然后有:

v=0 o=- 0 0 IN IP4 127.0.0.1 s=No Name c=IN IP4 127.0.0.1 t=0 0 a=tool:libavformat 58.29.100 m=video 11111 RTP/AVP 96 b=AS:569 a=rtpmap:96 H264/90000 a=fmtp:96 packetization-mode=1; sprop-parameter-sets=Z2QAH6zZQEQE3lqEAAAPpAAC7gA8YMZY,aO+Pyw==; profile-level-id=64001F

然后用vlc重新打开:

ps:

我直接用的命令行,因为能够看到出错信息:

vlc test_magic_01_video.sdp

出现界面,

 

等待一段时间,报错:

2020-07-09_20-23_2.png

 

无意中看到资料, 原来协议规定了rtp是偶数端口, rtcp是奇数端口, 而在 很多开源项目都遵守这个规定, 只要将端口改为偶数 vlc就能正常播放了. 

话说, 网上用端口11111来推送rtp流的例子是怎么用vlc播放的? vlc播放不了的啊.

 

 



【本文地址】


今日新闻


推荐新闻


    CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3